glsl: Make rounded rect clipping cheaper
authorMatthias Clasen <mclasen@redhat.com>
Mon, 8 Mar 2021 15:03:21 +0000 (10:03 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 8 Mar 2021 19:41:48 +0000 (14:41 -0500)
Add early acceptance checks for non-corner cases.

gsk/resources/glsl/preamble.fs.glsl

index cd0af69958a911cd625b768697650585dc8cfde8..3a2fe492404f9dd637a625b1e6b0a77fcee46f1e 100644 (file)
@@ -50,16 +50,24 @@ gsk_rounded_rect_coverage (GskRoundedRect r, vec2 p)
       p.x >= r.bounds.z || p.y >= r.bounds.w)
     return 0.0;
 
-  vec2 rad_tl = r.corner_points1.xy - r.bounds.xy;
-  vec2 rad_tr = r.corner_points1.zw - r.bounds.zy;
-  vec2 rad_br = r.corner_points2.xy - r.bounds.zw;
-  vec2 rad_bl = r.corner_points2.zw - r.bounds.xw;
-
   vec2 ref_tl = r.corner_points1.xy;
   vec2 ref_tr = r.corner_points1.zw;
   vec2 ref_br = r.corner_points2.xy;
   vec2 ref_bl = r.corner_points2.zw;
 
+  if (p.x >= ref_tl.x && p.x >= ref_bl.x &&
+      p.x <= ref_tr.x && p.x <= ref_br.x)
+    return 1.0;
+
+  if (p.y >= ref_tl.y && p.y >= ref_tr.y &&
+      p.y <= ref_bl.y && p.y <= ref_br.y)
+    return 1.0;
+
+  vec2 rad_tl = r.corner_points1.xy - r.bounds.xy;
+  vec2 rad_tr = r.corner_points1.zw - r.bounds.zy;
+  vec2 rad_br = r.corner_points2.xy - r.bounds.zw;
+  vec2 rad_bl = r.corner_points2.zw - r.bounds.xw;
+
   float d_tl = gsk_ellipsis_coverage(p, ref_tl, rad_tl);
   float d_tr = gsk_ellipsis_coverage(p, ref_tr, rad_tr);
   float d_br = gsk_ellipsis_coverage(p, ref_br, rad_br);